﻿Imports ASAP.TiposDatosSTE

Public Class EstadResultado

    Public PrimeraRondaAcertada As Dictionary(Of Integer, Integer)
    Public PorcentajeAciertos As Dictionary(Of Integer, Integer)

End Class

Public Structure EstadClaveLibro

    Public Nivel As String
    Public Volumen As Integer

End Structure

Public Structure EstadClaveLeccion

    Public Nivel As String
    Public Volumen As Integer
    Public TipoEjercicio As String
    Public Tema As String

End Structure

Public Class Estadisticas


    Public Shared Sub DameEstadisticas(ByVal nivel As String, _
                                       ByRef TotalPreguntas As Integer, _
                                       ByRef TotalPreguntasContestadas As Integer, _
                                       ByRef EstadisticasTotales As EstadResultado, _
                                       ByRef EstadisticasSecciones As Dictionary(Of String, EstadResultado), _
                                       ByRef EstadisticasLecciones As Dictionary(Of EstadClaveLeccion, EstadResultado), _
                                       ByRef EstadisticasLibro As Dictionary(Of EstadClaveLibro, EstadResultado), _
                                       ByRef EstadisticasTeorias As Dictionary(Of String, EstadResultado))

        TotalPreguntas = 0
        TotalPreguntasContestadas = 0
        EstadisticasTotales = New EstadResultado
        EstadisticasLibro = New Dictionary(Of EstadClaveLibro, EstadResultado)
        EstadisticasSecciones = New Dictionary(Of String, EstadResultado)
        EstadisticasLecciones = New Dictionary(Of EstadClaveLeccion, EstadResultado)
        EstadisticasTeorias = New Dictionary(Of String, EstadResultado)

        Using contexto As New TiposDatosSTE.ContenedorEntidades

            TotalPreguntas = contexto.Ejercicios.Count

            Dim ConsultaEjerciciosConRespuesta = From e As Ejercicio In contexto.Ejercicios.Include("Resultados")
                                                 Where e.Resultados.Any And e.Nivel = nivel

            Dim tieneCorrectos As Boolean
            Dim totalCorrectos, totalIncorrectos As Integer
            Dim PrimerAcierto, PorcentajeAcierto As Integer
            Dim ronda As Integer
            For Each ejer As Ejercicio In ConsultaEjerciciosConRespuesta

                'Estadisticas ejercicio
                tieneCorrectos = False
                totalCorrectos = 0
                totalIncorrectos = 0
                PorcentajeAcierto = 0
                PrimerAcierto = 0
                ronda = 1

                For Each resultado As Resultado In ejer.Resultados.OrderBy(Function(r) r.Fecha)
                    If resultado.Correcto Then
                        tieneCorrectos = True
                        totalCorrectos = totalCorrectos + 1
                        If PrimerAcierto = 0 Then
                            PrimerAcierto = ronda
                        End If
                    Else
                        totalIncorrectos = totalIncorrectos + 1
                    End If
                    ronda = ronda + 1
                Next

                PorcentajeAcierto = CInt(Math.Round((totalCorrectos / (totalIncorrectos + totalCorrectos)) * 100, 0))

                'Estadisticas totales
                EstadTotales(ejer, EstadisticasTotales, PrimerAcierto, PorcentajeAcierto)

                'Estadisticas seccion
                EstadSeccion(ejer, EstadisticasSecciones, PrimerAcierto, PorcentajeAcierto)

                'Estadisticas leccion
                EstadLeccion(ejer, EstadisticasLecciones, PrimerAcierto, PorcentajeAcierto)

                'Estadisticas libro
                EstadLibro(ejer, EstadisticasLibro, PrimerAcierto, PorcentajeAcierto)

                'Estadisticas generales
                TotalPreguntasContestadas = TotalPreguntasContestadas + 1

            Next

        End Using

    End Sub


    Private Shared Sub EstadTotales(ByVal Ejer As Ejercicio, _
                     ByVal EstadisticasTotales As EstadResultado, _
                     ByVal PrimerAcierto As Integer, _
                     ByVal PorcentajeAcierto As Integer)

        If EstadisticasTotales.PorcentajeAciertos Is Nothing Then
            CreaEstadResultado(EstadisticasTotales, PrimerAcierto, PorcentajeAcierto)
        Else
            ActualizaEstadResultado(EstadisticasTotales, PrimerAcierto, PorcentajeAcierto)
        End If

    End Sub

    Private Shared Sub EstadLibro(ByVal Ejer As Ejercicio, _
                         ByVal EstadisticasLibro As Dictionary(Of EstadClaveLibro, EstadResultado), _
                         ByVal PrimerAcierto As Integer, _
                         ByVal PorcentajeAcierto As Integer)

        Dim claveLibro As New EstadClaveLibro
        claveLibro.Nivel = Ejer.Nivel
        claveLibro.Volumen = Ejer.Volumen

        If EstadisticasLibro.ContainsKey(claveLibro) Then
            Dim res As EstadResultado
            res = EstadisticasLibro(claveLibro)
            ActualizaEstadResultado(res, PrimerAcierto, PorcentajeAcierto)
        Else
            Dim res As New EstadResultado
            CreaEstadResultado(res, PrimerAcierto, PorcentajeAcierto)
            EstadisticasLibro.Add(claveLibro, res)
        End If

    End Sub

    Private Shared Sub EstadSeccion(ByVal Ejer As Ejercicio, _
                             ByVal EstadisticasSecciones As Dictionary(Of String, EstadResultado), _
                             ByVal PrimerAcierto As Integer, _
                             ByVal PorcentajeAcierto As Integer)

        If EstadisticasSecciones.ContainsKey(Ejer.TipoEjercicio) Then
            Dim res As EstadResultado
            res = EstadisticasSecciones(Ejer.TipoEjercicio)
            ActualizaEstadResultado(res, PrimerAcierto, PorcentajeAcierto)
        Else
            Dim res As New EstadResultado
            CreaEstadResultado(res, PrimerAcierto, PorcentajeAcierto)
            EstadisticasSecciones.Add(Ejer.TipoEjercicio, res)
        End If

    End Sub

    Private Shared Sub EstadLeccion(ByVal Ejer As Ejercicio, _
                             ByVal EstadisticasLecciones As Dictionary(Of EstadClaveLeccion, EstadResultado), _
                             ByVal PrimerAcierto As Integer, _
                             ByVal PorcentajeAcierto As Integer)

        'Estadisticas leccion
        Dim claveLeccion As New EstadClaveLeccion
        claveLeccion.Nivel = Ejer.Nivel
        claveLeccion.Tema = Ejer.Tema
        claveLeccion.TipoEjercicio = Ejer.TipoEjercicio
        claveLeccion.Volumen = Ejer.Volumen

        If EstadisticasLecciones.ContainsKey(claveLeccion) Then
            Dim res As EstadResultado
            res = EstadisticasLecciones(claveLeccion)
            ActualizaEstadResultado(res, PrimerAcierto, PorcentajeAcierto)
        Else
            Dim res As New EstadResultado
            CreaEstadResultado(res, PrimerAcierto, PorcentajeAcierto)
            EstadisticasLecciones.Add(claveLeccion, res)
        End If

    End Sub

    Private Shared Sub ActualizaEstadResultado(ByVal res As EstadResultado, ByVal PrimerAcierto As Integer, _
                                    ByVal PorcentajeAcierto As Integer)

        If res.PorcentajeAciertos.ContainsKey(PorcentajeAcierto) Then
            res.PorcentajeAciertos(PorcentajeAcierto) += 1
        Else
            res.PorcentajeAciertos.Add(PorcentajeAcierto, 1)
        End If

        If res.PrimeraRondaAcertada.ContainsKey(PrimerAcierto) Then
            res.PrimeraRondaAcertada(PrimerAcierto) += 1
        Else
            res.PrimeraRondaAcertada.Add(PrimerAcierto, 1)
        End If

    End Sub

    Private Shared Sub CreaEstadResultado(ByVal res As EstadResultado, ByVal PrimerAcierto As Integer, _
                                    ByVal PorcentajeAcierto As Integer)

        res.PorcentajeAciertos = New Dictionary(Of Integer, Integer)
        res.PorcentajeAciertos.Add(PorcentajeAcierto, 1)

        res.PrimeraRondaAcertada = New Dictionary(Of Integer, Integer)
        res.PrimeraRondaAcertada.Add(PrimerAcierto, 1)

    End Sub


End Class
